import os
import subprocess
import platform
import shutil
from dotenv import load_dotenv
from app.utils.logger import get_logger

logger = get_logger(__name__)

load_dotenv()

def is_command_available(command):
    """
    检查命令是否可用
    """
    command_exists = shutil.which(command) is not None
    return command_exists

def check_ffmpeg_exists() -> bool:
    """
    检查 ffmpeg 是否可用。优先使用 FFMPEG_BIN_PATH 环境变量指定的路径。
    """
    ffmpeg_bin_path = os.getenv("FFMPEG_BIN_PATH")
    logger.info(f"FFMPEG_BIN_PATH: {ffmpeg_bin_path}")
    if ffmpeg_bin_path and os.path.isdir(ffmpeg_bin_path):
        os.environ["PATH"] = ffmpeg_bin_path + os.pathsep + os.environ.get("PATH", "")
        logger.info(f"ffmpeg 未配置路径，尝试使用系统路径PATH: {os.environ.get('PATH')}")
    try:
        subprocess.run(["ffmpeg", "-version"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True)
        logger.info("ffmpeg 已安装")
        return True
    except (FileNotFoundError, OSError, subprocess.CalledProcessError):
        logger.info("ffmpeg 未安装")
        return False


def ensure_ffmpeg_or_raise():
    """
    确保 FFmpeg 可用，否则抛出异常
    """
    # 检查 ffmpeg 可用性
    if not is_command_available("ffmpeg"):
        error_message = (
            "⚠️ 未找到 FFmpeg。请确保 FFmpeg 已安装并添加到系统 PATH。\n"
            "参考链接：https://ffmpeg.org/download.html\n"
        )
        if platform.system() == "Windows":
            error_message += (
                "Windows 安装建议：\n"
                "1. 下载 FFmpeg: https://www.gyan.dev/ffmpeg/builds/\n"
                "2. 解压并添加 bin 目录到系统 PATH\n"
            )
        elif platform.system() == "Darwin":  # macOS
            error_message += (
                "macOS 安装建议：\n"
                "使用 Homebrew 安装: brew install ffmpeg\n"
            )
        else:  # Linux
            error_message += (
                "Linux 安装建议：\n"
                "Ubuntu/Debian: sudo apt install ffmpeg\n"
                "CentOS/RHEL: sudo dnf install ffmpeg\n"
            )

        logger.error(error_message)
        raise RuntimeError("FFmpeg 未安装")
    
    # 检查 ffprobe 可用性（通常与 ffmpeg 一起安装）
    if not is_command_available("ffprobe"):
        error_message = (
            "⚠️ 未找到 FFprobe。FFprobe 通常与 FFmpeg 一起安装，请确保完整安装了 FFmpeg。\n"
            "参考链接：https://ffmpeg.org/download.html\n"
        )
        logger.error(error_message)
        raise RuntimeError("FFprobe 未安装")
    
    logger.info("👍 FFmpeg 和 FFprobe 已可用")
    return True